<body>
<script>

window.testStatus = '';
var objects = ['runtime', 'require', 'test', 'binding'];
var leaked = [];

function intercept(objectKey) {
  Object.defineProperty(Object.prototype, objectKey, {
    get: function () {
      leaked.push({name: objectKey, obj: this});
    },
    set: function (v) {
      Object.defineProperty(this, objectKey, {
        value: v,
        configurable: true,
        enumerable: true,
        writable: true
      });
    },
    configurable: true,
  });
}

// Set up interceptors.
for (let objectKey of objects)
  intercept(objectKey);

// Poke chrome.runtime and chrome.app.
try {
  chrome.runtime;
} catch (e) {}
try {
  chrome.app;
} catch (e) {}

// Cleanup - we don't want to be triggering our own interceptors.
for (let objKey of objects)
  delete Object.prototype[objKey];

// Check what we intercepted.
var keysToCheck = ['utils', 'binding'];
for (let nameAndObj of leaked) {
  for (let key of keysToCheck) {
    if (!!nameAndObj.obj[key]) {
      window.testStatus +=
          'Failed: Found ' + key + ' on ' + nameAndObj.name + '\n';
    }
  }
}

if (window.testStatus === '')
  window.testStatus = 'success';

</script>
</body>
